/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tableautrieabstraitgenerique;

/**
 *
 * @author pfares
 */
public abstract class TableauTrieAbstrait {

    TableauTrieAbstrait() {
        capacite = 10;
        increment = 3;
        table = new Object[capacite];
    }

    TableauTrieAbstrait(int capacite, int increment) {
        this.capacite = capacite;
        this.increment = increment;
        table = new Object[capacite];
    }
    private int capacite;
    private int increment;
    private Object[] table;
    private int taille = 0;

    // si o1 > o2 alors plusGrand renvoie true false sinon
    abstract boolean plusGrand(Object o1, Object o2);

    private void agrandir() {
        capacite += increment;
        Object[] grandTableau = new Object[capacite];
        //copie du petit tableau dans le grand
        for (int i = 0; i < taille; i++) {
            grandTableau[i] = table[i];
        }
        table = grandTableau;
    }

    void insert(Object element) {
        int i;
        //si le tableau est plein on cree un nouveau tableau plus grand
        if (taille == capacite) {
            agrandir();
        }
        i=taille-1;
        while ((i>=0) && (plusGrand(table[i],element))) {
            table[i+1]=table[i];
            i--;
        }
        //on sort de la boucle quand i=-1 || table[i] < element
        table[i+1] = element;
        taille++;
    }
    private void diminuer() {
            capacite -= increment;
            Object[] petitTableau=new Object[capacite];
            for (int i=0;i<taille;i++) petitTableau[i]=table[i];
            table=petitTableau;
    }
    void supprimer(Object element) {
        int i=0;
        while ((i<taille) && (!element.equals(table[i]))) i++;
        //on sort de la boucle soit i=taille || soit element==table[i]
        if (i<taille) {
            //on a trouve un element a la position i
            while (i<taille-1) {
                table[i]=table[i+1];
                i++;
            }
            taille--;
        }
        if (taille==capacite-2*increment) //on diminue la taille du tableau
        {
           diminuer();
        }

    }
    public String toString() {
        String res="{";
        for (int i=0;i<taille-1;i++) res += table[i]+" ";
        res += table[taille-1]+"}";
        return res;
    }
}
